package main

import (
	"fmt"
	"time"
)

func main() {
	//select 的特点是只要其中有一个 case 已经完成，程序就会继续往下执行，而不会考虑其他 case 的情况

	ch := make(chan int)
	quit := make(chan bool)

	//新开一个协程
	go func() {
		for {
			select {
			case num := <-ch:
				fmt.Println("num = ", num)
			case <-time.After(3 * time.Second):
				fmt.Println("超时")
				quit <- true
				// default:
				// 	fmt.Println("没有数据到来，继续等待...")
			}

		}

	}()

	for i := 0; i < 5; i++ {
		ch <- i
		time.Sleep(time.Second)
	}

	<-quit
	fmt.Println("程序结束")
}

// select 是 Go 语言里专门给 channel 设计的 “多路复用” 语法，长相跟 switch 很像，但只针对 chan 的读写事件。
// 同时等待多个 channel 操作，谁先到就执行谁，如果多个同时到则伪随机挑一个，全部阻塞则挂起，有 default 就不阻塞
